package edu.imu.question.service.impl;

import edu.imu.question.config.QuestionnaireStatusEnum;
import edu.imu.question.entity.Questionnaire;
import edu.imu.question.entity.QuestionnaireQuestion;
import edu.imu.question.entity.QuestionnaireQuestionOption;
import edu.imu.question.entity.ResponseResult;
import edu.imu.question.mapper.QuestionnaireMapper;
import edu.imu.question.mapper.QuestionnaireQuestionMapper;
import edu.imu.question.mapper.QuestionnaireQuestionOptionMapper;
import edu.imu.question.service.LoginUserService;
import edu.imu.question.service.QuestionnaireCloneService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Service
public class QuestionnaireCloneServiceImpl extends QuestionnaireBaseService implements QuestionnaireCloneService {
    private QuestionnaireQuestionMapper questionnaireQuestionMapper;
    private QuestionnaireMapper questionnaireMapper;
    private QuestionnaireQuestionOptionMapper questionnaireQuestionOptionMapper;

    @Autowired
    protected QuestionnaireCloneServiceImpl(QuestionnaireMapper questionnaireMapper, QuestionnaireQuestionMapper questionnaireQuestionMapper, QuestionnaireQuestionOptionMapper questionnaireQuestionOptionMapper) {
        super(questionnaireMapper);
        this.questionnaireMapper = questionnaireMapper;
        this.questionnaireQuestionMapper = questionnaireQuestionMapper;
        this.questionnaireQuestionOptionMapper = questionnaireQuestionOptionMapper;
    }

    @Override
    @Transactional
    public ResponseResult copy(long sourceQuestionnaireId, String newName, String newDesc) {
        Questionnaire questionnaire = getUserQuestionnaire(sourceQuestionnaireId);
        if (questionnaire == null)
            return ResponseResult.error("问卷不存在或已被删除", null);
        List<QuestionnaireQuestion> questions = questionnaireQuestionMapper.findByQuestionnaireId(sourceQuestionnaireId);
        List<Long> sourceQuestionIds = questionnaireQuestionMapper.findIdByQuestionnaireId(sourceQuestionnaireId);
        //创建新的调查问卷
        Questionnaire newQuestionnaire = createNewQuestionnaire(newName, newDesc, questions.size());
        questionnaireMapper.add(newQuestionnaire);
        //复制问题
        copyQuestions(newQuestionnaire.getId(), questions);
        //复制问题选项
        copyQuestionOption(sourceQuestionIds, questions);
        return ResponseResult.ok();
    }

    private Questionnaire createNewQuestionnaire(String newName, String newGreeting, int questionCount) {
        Questionnaire newQuestionnaire = new Questionnaire();
        newQuestionnaire.setName(newName);
        newQuestionnaire.setQuestionCount(questionCount);
        newQuestionnaire.setGreeting(newGreeting);
        newQuestionnaire.setCreateDate(new Date());
        newQuestionnaire.setUserId(LoginUserService.getLoginUser().getId());
        newQuestionnaire.setStatus(QuestionnaireStatusEnum.DESIGN.intValue());
        newQuestionnaire.setInvokeCount(0);
        return newQuestionnaire;
    }

    private void copyQuestionOption(List<Long> sourceQuestionIds, List<QuestionnaireQuestion> newQuestions) {
        int i = 0;
        for (Long sourceQuestionId : sourceQuestionIds) {
            List<QuestionnaireQuestionOption> options = questionnaireQuestionOptionMapper
                    .findByQuestionId(sourceQuestionId);
            QuestionnaireQuestion newQuestion = newQuestions.get(i++);
            for (QuestionnaireQuestionOption option : options) {
                option.setId(null);
                option.setQuestionId(newQuestion.getId());
                questionnaireQuestionOptionMapper.add(option);
            }
        }
    }

    private void copyQuestions(long newQuestionnaireId, List<QuestionnaireQuestion> questions) {
        for (QuestionnaireQuestion question : questions) {
            question.setId(null);
            question.setQuestionnaireId(newQuestionnaireId);
            questionnaireQuestionMapper.add(question);
        }
    }
}
